<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Function</title>
    <script>
        /**
         * 这是一个非常经典的阶乘函数
         */
        function factroial(num) {
            if (num <= 1) {
                return num;
            } else {
                return num * factroial(num - 1);
            }
        }

        console.log(factroial(5));

        /**
         * 因为 属性指向拥有arguments对象的函数,所以上边的示例也可以按下边的方式来写
         */

        function factroial2(num) {
            if (num <= 1) {
                return num;
            } else {
                return num * arguments.callee(num - 1);
            }
        }
        console.log(factroial2(5));

        /**
         * this
         */
        window.color = "red";
        let o = {color: "blue"}

        function  sayColor (){
            alert(this.color);
        }

        sayColor();//red 此时this指向的就是window
        //函数本质就是一个对象，函数名就是一个变量，此处将sayColor变量赋给对象o，对象o就多了一个属性sayColor，该指针就指向了堆中的函数sayColor
        o.sayColor = sayColor;//执行完这行代码后 此时this指向的就是对象o
        o.sayColor();//blue

    </script>
</head>
<body>
函数内部属性
</body>
</html>